﻿/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#ifndef __2DB66CB7_3E8A_40ee_B19D_EAC3473FC956__
#define __2DB66CB7_3E8A_40ee_B19D_EAC3473FC956__

#include "../tools/head.h"
#include "list_iter.h"

/////////////////////////////////////////////////////////////////////////////////////////
// 
namespace xos_box
{

    // 
    // list impl
    // 
    class list_impl : public xos_stl::mem_item< xos::release_impl< list_impl >, thread_lock >,
        public i_list
    {
	public:
        typedef xos::release_impl< list_impl > T;

    public:
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //
        static int get_addr( POOL *** pppPool, LIST *** pppList );
        static int static_user_init();
        static int static_user_term();

    public:
        list_impl();
        ~list_impl();

    public:
        int init();
        int term();

    protected:
        xos_list::ITEM_LIST m_item_list;
        xos_list::ITEM_ITER m_item_iter;

    public:
        // 
        // add back
        // 
        int push_back( xos::i_release * pObj );

        // 
        // return last, but not remove
        // 
        xos::i_release * back( xos::i_release ** ppObj );

        // 
        // pop back
        // 
        int pop_back();

        // 
        // add front
        // 
        int push_front( xos::i_release * pObj );

        // 
        // return first, but not remove
        // 
        xos::i_release * front( xos::i_release ** ppObj );

        // 
        // pop front
        // 
        int pop_front();

        // 
        // remove with xos::i_release *
        // 
        int remove( xos::i_release * pObj );

        // 
        // point to next after remove.
        // 
        xos::i_release * remove();

        // 
        // reset list iter
        // 
        int reset();

        // 
        // null if to end
        // 
        xos::i_release * next();

        // 
        // 得到list的前后向迭代器
        // 
        i_list_iter * rbegin();
        i_list_iter * begin();

        // 
        // list operation
        // 
        int add_to_front( xos_box::i_list * pList );
        int add_to_tail( xos_box::i_list * pList );
        int swap( xos_box::i_list * pList );

        // 
		// release all, release contained object
        // 
        int release_all();

        // 
		// clear not release contained object
        // 
        int clear();

        // 
        // list item num
        // 
        int size();

        // 
        // unlock/lock
        // 
        int un_lock();

        // 
        // unlock/lock
        // 
        int lock();
    };
}

#endif // __2DB66CB7_3E8A_40ee_B19D_EAC3473FC956__
